home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacWorld 1999 July
/
Macworld (1999-07).dmg
/
Shareware World
/
Info
/
For Developers
/
Mops 3.4.sea
/
Mops source
/
Demo folder
/
Matrix test
< prev
next >
Wrap
Text File
|
1993-02-27
|
5KB
|
215 lines
\ Matrix timing test. Nov 91.
need floating point
\ Usage: 50 100 dimension Fmatrix MM
0 value ROWDIM
0 value COLDIM
: DIMENSION
-> colDim -> rowDim
colDim rowDim * ;
:class FMATRIX super{ Farray }
var #rows
var #cols
var rowLength
var colLength
:m #ROWS: get: #rows ;m
:m #COLS: get: #cols ;m
:m ^ELEM: { row col \ temp -- addr }
row get: #cols * col + ^elem: super ;m
:m AT: ^elem: self f@ ;m
:m TO: ^elem: self f! ;m
:m ROW: { row -- limit start stride } \ Sets up for a DO over the row.
row get: rowLength * idxBase + \ addr
get: rowLength bounds \ ( limit addr )
12 ;m \ stride
:m COL: { col -- limit start stride } \ Sets up for a DO over the column.
col 12 * idxBase + \ addr
get: colLength bounds \ ( limit addr )
get: rowLength ;m \ stride
:m PUTROW: \ ( 1st ... last row -- )
row: self drop ( we know stride is 12 )
swap 12 -
do i f! -12 +loop ;m
:m PRINTROW: { row -- }
row row: self drop
?do i f@ 10 e.r 12 +loop ;m
:m PRINTCOL: { col \ stride -- }
col col: self -> stride
?do i f@ 10 e.r cr stride +loop ;m
:m PRINT:
get: #rows 0
?do i printRow: self cr loop ;m
:m CLASSINIT:
rowDim put: #rows colDim put: #cols
get: #cols 12 * put: rowLength
get: #rows get: rowLength * put: colLength
classinit: super ;m
;class
5 3 dimension Fmatrix FF
objPtr A class_is Fmatrix
objPtr B class_is Fmatrix
objPtr C class_is Fmatrix
: DIMSCHK { l m n -- }
#rows: B m <>
l #rows: C <>
n #cols: C <>
or or abort" Wrong operand dimensions for matrix multiply" ;
: MXMPY { m1 m2 m3 \ l m n Aaddr Alimit Baddr stride %sum -- }
m1 -> A m2 -> B m3 -> C
#rows: A -> l #cols: A -> m #cols: B -> n
l m n dimsChk
l 0 DO
i row: A drop -> Aaddr -> Alimit
n 0 DO
0.0 -> %sum
i col: B -> stride -> Baddr drop
Alimit Aaddr
DO i f@ Baddr f@ f* ++> %sum
stride ++> Baddr
12 +LOOP
%sum j i to: C
LOOP
LOOP ;
: DUMMY { m1 m2 m3 \ l m n Aaddr Alimit Baddr stride %sum -- }
m1 -> A m2 -> B m3 -> C
#rows: A -> l #cols: A -> m #cols: B -> n
l m n dimsChk
l 0 DO
i row: A drop -> Aaddr -> Alimit
n 0 DO
0.0 -> %sum
i col: B -> stride -> Baddr drop
Alimit Aaddr
DO
\ i f@ Baddr f@ f2drop
\ Note: omit this line entirely for UseFPU? True test,
\ otherwise overhead figure is artificially high.
stride ++> Baddr
12 +LOOP
%sum j i to: C
LOOP
LOOP ;
: SLOWMPY { m1 m2 m3 \ l m n %sum -- }
m1 -> A m2 -> B m3 -> C
#rows: A -> l #cols: A -> m #cols: B -> n
l m n dimsChk
l 0 DO
n 0 do
0.0 -> %sum
m 0 DO
k i at: A i j at: B f* ++> %sum
LOOP
%sum j i to: C
LOOP
LOOP ;
: SLOWDUMMY { m1 m2 m3 \ l m n %sum -- }
m1 -> A m2 -> B m3 -> C
#rows: A -> l #cols: A -> m #cols: B -> n
l m n dimsChk
l 0 DO
n 0 DO
0.0 -> %sum
m 0 DO
k i at: A i j at: B f2drop
LOOP
%sum j i to: C
LOOP
LOOP ;
3 5 dimension fmatrix matA
5 3 dimension fmatrix matB
3 3 dimension fmatrix matC
-2.0 -7.0 -4.0 8.0 1.0 0 putRow: matA
-3.0 0.0 -1.0 0.0 -9.0 1 putRow: matA
0.0 -1.0 -8.0 -9.0 -3.0 2 putRow: matA
-1.0 3.0 -2.0 0 putRow: matB
4.0 -1.0 1.0 1 putRow: matB
9.0 -4.0 -8.0 2 putRow: matB
-5.0 0.0 -3.0 3 putRow: matB
6.0 3.0 -6.0 4 putRow: matB
0.0 fvalue TOTAL
0.0 fvalue OVERHEAD
0.0 fvalue CALCS
0.0 fvalue SLOWTOTAL
0.0 fvalue SLOWOVERHEAD
0.0 fvalue SLOWCALCS
: MATINIT \ ( mat -- )
-> A
#rows: A 0
do
#cols: A 0
do
i j + >float j i to: A
loop
loop ;
: TICKS global Ticks @ ;
: .RESULTS \ ( flt -- )
fdup 6 f.r 6 spaces
20.0 f* 16.0 f/ ." scaled: " 6 f.r cr ;
: TIMER { mx1 mx2 mx3 -- }
mx1 matinit mx2 matinit
ticks
10 0 do mx1 mx2 mx3 mxmpy loop
ticks swap - >float 600.0 f/ -> total
ticks
10 0 do mx1 mx2 mx3 dummy loop
ticks swap - >float 600.0 f/ -> overhead
total overhead f- -> calcs
ticks
10 0 do mx1 mx2 mx3 slowmpy loop
ticks swap - >float 600.0 f/ -> slowtotal
ticks
10 0 do mx1 mx2 mx3 slowDummy loop
ticks swap - >float 600.0 f/ -> slowoverhead
slowTotal slowOverhead f- -> slowCalcs
." Total " total .results
." Calcs " calcs .results
." Overhead" overhead .results
." Slow total" slowTotal .results
." Slow calcs" slowCalcs .results
." Slow overhead" slowOverhead .results ;
50 50 dimension fmatrix SOURCE
50 50 dimension fmatrix RESULT